package test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author sunzhuokun
 * @date 16:01 2024/5/15
 * @description 最长的指定瑕疵度的元音子串
 * 注意要选好先判断左指针还是右指针可以节省不必要的操作。
 * 定义：开头和结尾都是元音字母（aeiouAEIOU）的字符串为元音字符串，其中混杂的非元音字母数量为瑕疵度。比如：
 * <p>
 * “a”、“aa”是元音字符串，其瑕疵度都为0
 * <p>
 * “aiur”不是元音字符串（结尾不是元音字符）
 * <p>
 * “abira”是元音字符串，其瑕疵度为2
 * <p>
 * 给定一个字符串，请找出指定瑕疵度的最长元音字符子串，并输出其长度，如果找不到满足条件的元音字符子串，输出0.
 * <p>
 * 子串：字符串中任意个连续的字符组成的子序列称为该字符串的子串
 * <p>
 * 输入
 * <p>
 * 首行输入是一个整数，表示预期的瑕疵度flaw，取值范围[0,65535]。
 * <p>
 * 接下来一行是一个仅由字符a-z和A-Z组成的字符串，字符串长度（0,65535]。
 * <p>
 * 输出
 * <p>
 * 输出为一个整数，代表满足条件的元音字符子串的长度。
 * <p>
 * 样例
 * <p>
 * 输入样例1
 * 0
 * asdbuiodevauufgh
 * 输出样例1
 * 3
 */
public class LongestVowelSubstring_最长的指定瑕疵度的元音子串 {

    public static void main(String[] args) {
        String str = "asdbuiodevauufgh";
        int flaw = 0;
        System.out.println(vowelSubstring(str, flaw));
    }

    private static int vowelSubstring(String str, int flaw) {
        int start = 0;
        int end = 0;
        String vowel = "aeiouAEIOU";
        int curFlaw = 0;
        List<String> list = new ArrayList<>();
        for (end = 0; end < str.length(); end++) {
            // 判断是否元音
            boolean isRightYuan = vowel.contains(String.valueOf(str.charAt(end)));
            if (isRightYuan == false) {
                curFlaw++;
            }
            // 要求足够的瑕疵度
            if (isRightYuan == false || curFlaw < flaw) {
                continue;
            }
            // 达到足够瑕疵度，并且左边也是元音，记录子串
            if (curFlaw == flaw && vowel.contains(String.valueOf(str.charAt(start)))) {
                list.add(str.substring(start, end + 1));
                continue;
            }
            // 当瑕疵度大于要求或子串左边非元音时，移动左指针
            while (curFlaw > flaw || !vowel.contains(String.valueOf(str.charAt(start)))) {
                start++;
                // 判断前一个位置不是元音，扣减后跳出
                if (!vowel.contains(String.valueOf(str.charAt(start - 1)))) {
                    curFlaw--;
                }
                if (start > end) {
                    start = end;
                    break;
                }
            }
            // 判断跳出循环时是否符合要求
            if (curFlaw == flaw && vowel.contains(String.valueOf(str.charAt(start)))) {
                list.add(str.substring(start, end + 1));
            }
        }

        if (list.size() > 1) {
            list.sort((o1, o2) -> o2.length() - o1.length());
            return list.get(0).length();
        } else if (list.size() == 1) {
            return list.get(0).length();
        } else {
            return 0;
        }
    }
}
